// 引入模块
var mongodb = require("mongodb");
var mongoCt = mongodb.MongoClient;
let ObjectId = mongodb.ObjectId
// 引用的数据库名
let sql = "app"
// 定义功能函数

// 链接库
// dbName(数据库名) collectionName(要操作的集合名) url(连接的数据库地址)
let open = ({
    dbName = sql,
    collectionName,
    url = 'mongodb://127.0.0.1:27017'
}) => {
    // 用promise去将异步的操作做到同步操作
    return new Promise((resolve, reject) => {
        // 数据库的连接,失败或成功 ,client链接后的客户端
        mongoCt.connect(url, (err, client) => {
            // 失败
            if (err) {
                // 返回失败的原因
                reject(err);
            } else {
                // 成功就将要操作的集合和链接之后的客户端返回
                let db = client.db(dbName);
                let collection = db.collection(collectionName);
                resolve({
                    collection,
                    client,
                    ObjectId
                });
            }

        })

    })

}

// 查找列表
let findList = ({
    collectionName, //集合名
    dbName = sql, //库名
    _page,
    _limit,
    _sort,
    q //可选参数
}) => {
    // 检索条件
    // 动态获取检索条件 
    let rule = q ? {
        // 想要查询的属性
        // 只能处理字符串，处理数字不加/
        // eval方法将括号内为字符的直接作为代码
        name: eval('/' + q + '/')
    } : {};
    // console.log(q)

    return new Promise((resolve, reject) => {
        // 开库
        open({
            dbName,
            collectionName
            // 开库成功
        }).then(
            ({
                collection,
                client
            }) => {
                // 查询条件
                // console.log(rule)
                collection.find(rule, {
                    // 获取动态的排序方式
                    sort: {
                        [_sort]: -1
                    },
                    skip: _page * _limit, //跳过
                    limit: _limit //限制
                }).toArray((err, result) => {
                    // 把查询结果返回出去
                    // 成功
                    // console.log(result)
                    if (!err && result.length > 0) {
                        resolve({
                            err: 0,
                            msg: '成功',
                            data: result
                        })
                    } else {
                        reject({
                            err: 1,
                            msg: '查不到更多数据'
                        })
                    }
                    client.close(); //关库
                })
            }
        ).catch(
            ({
                collection,
                client
            }) => {
                err => {
                    reject({
                        err: 1,
                        msg: '库链接失败'
                    });
                    client.close();
                }
            });
    })
}

// 查详情
let findDetail = ({
    // 参数
    // 数据库名
    dbName = sql,
    // 集合名
    collectionName,
    // 对应的id
    _id = null
}) => new Promise((resolve, reject) => {
    open({
        collectionName,
        dbName
    }).then(
        ({
            collection,
            client
        }) => {
            // 查询，判断id
            // 存在
            if (_id && _id.length === 24) {
                collection.find({
                    // 条件
                    // 到集合里面去查询id
                    _id: ObjectId(_id) // mongodb里面的id是通过ObjectId类去包装的
                }, {
                    // 指定要显示的列区域 值为0不显示
                    projection: {
                        _id: 0
                    }
                }).toArray((err, result) => {
                    // 通过resolve和reject把正确和错误的结果输出
                    // 查询成功
                    // console.log("err " + err);
                    // console.log(result);
                    if (!err && result.length > 0) {
                        resolve({
                            err: 0,
                            msg: "查询成功",
                            // 数据是以数组的查询到的
                            data: result[0]
                        })
                    } else {
                        // 查询不到数据
                        reject({
                            err: 1,
                            msg: "查无数据"
                        })
                    }
                    // 查询之后关库
                    client.close();
                })
            } else {
                // id错误
                reject({
                    err: 1,
                    msg: "id有误"
                })
                // 最后关库
                client.close();
            }
        }
    )
})

// 输出功能函数
exports.open = open;
exports.findList = findList;
exports.findDetail = findDetail;